{ "err_no": 0, "err_msg": "success", "data": { "booklet": { "booklet_id": "7086408430491172901", "base_info": { "id": 0, "booklet_id": "7086408430491172901", "title": "TypeScript 全面进阶指南", "price": 4990, "category_id": "6809637767543259144", "status": 1, "user_id": "782508012077678", "verify_status": 4, "summary": "从类型编程到工程实践, 迈向 TypeScript 高级玩家", "cover_img": "https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/35864b55ce8c4137bf9f26d438a2fe15~tplv-k3u1fbpfcp-watermark.image?", "section_count": 34, "section_ids": "7086408452406247454|7086435924271169550|7100485525823782951|7086435924392804388|7087052987415134244|7100487738012467212|7100487738020855811|7100487786033053734|7100485525831680032|7100487863032086561|7086440845053788196|7100488161263878177|7100487834879918113|7100488836853006375|7100487920280141836|7086436622425653285|7088641915502985250|7100488803369877543|7105947956359987212|7107458432751370273|7105947956183826464|7102447359308595240|7107603379022463009|7107533935978119171|7088147142862176293|7107603438330413059|7110429713230725153|7107603540327006220|7107603583419285536|7107603489647247372|7110467427141419019|7107603620119445536|7107604005907333124|7107603967302959116|7109709136928964646", "is_finished": 0, "ctime": 1650786767, "mtime": 1658055554, "put_on_time": 1655888168, "pull_off_time": -62135596800, "finished_time": -62135596800, "recycle_bin_time": -62135596800, "verify_time": -62135596800, "submit_time": 1658055554, "top_time": 1655888187, "wechat_group_img": "https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/2ffdaa147dbe40869871b50f945e4554~tplv-k3u1fbpfcp-watermark.image?", "wechat_group_desc": "", "wechat_group_signal": "TS0622", "read_time": 64575, "buy_count": 2027, "course_type": 1, "background_img": "https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/f3ffc0a19d8a43f5b30fb1483026f013~tplv-k3u1fbpfcp-watermark.image?", "is_distribution": 1, "distribution_img": "https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/401e803eaa374249937f091111f8ec1e~tplv-k3u1fbpfcp-zoom-1.image?", "commission": 998, "can_vip_borrow": false, "is_sign": true }, "reading_progress": { "id": 0, "booklet_id": "7086408430491172901", "user_id": "3210229681503629", "status": 1, "buy_type": 1, "reading_end": 0, "reading_progress": 0, "last_section_id": "0", "has_update": 1, "last_rtime": 1658128542, "ctime": 1658128543, "mtime": 1658224490, "valid_begin_time": 0, "valid_end_time": 0, "borrow_times": 0 }, "user_info": { "user_id": "782508012077678", "user_name": "林不渡", "company": "阿里巴巴", "job_title": "切图小能手", "avatar_large": "https://p9-passport.byteacctimg.com/img/user-avatar/225efb821fdbd6976c6896c3fa41906a~300x300.image", "level": 3, "description": "冇", "followee_count": 31, "follower_count": 991, "post_article_count": 30, "digg_article_count": 51, "got_digg_count": 1407, "got_view_count": 86518, "post_shortmsg_count": 0, "digg_shortmsg_count": 0, "isfollowed": false, "favorable_author": 0, "power": 2272, "study_point": 0, "university": { "university_id": "0", "name": "", "logo": "" }, "major": { "major_id": "0", "parent_id": "0", "name": "" }, "student_status": 0, "select_event_count": 0, "select_online_course_count": 0, "identity": 0, "is_select_annual": true, "select_annual_rank": 0, "annual_list_type": 0, "extraMap": {}, "is_logout": 0, "annual_info": [], "account_amount": 0, "user_growth_info": { "user_id": 782508012077678, "jpower": 0, "jscore": 75.2, "jpower_level": 0, "jscore_level": 3, "jscore_title": "新星掘友", "author_achievement_list": [], "vip_level": 1, "vip_title": "初学乍练" }, "is_vip": true }, "event_discount": null, "is_buy": true, "section_updated_count": 26, "is_new": true }, "introduction": { "id": 86885, "section_id": "7086408452406247454", "title": "小册介绍", "user_id": "782508012077678", "booklet_id": "7086408430491172901", "status": 0, "content": "

你将获得

\n\n

作者介绍

\n

\"作者简介(2100x389).jpg\"

\n

林不渡,阿里巴巴前端开发工程师。深耕 TypeScript,在团队中参与制定并推广 TypeScript 相关研发规约。热爱分享,曾在极客时间、前端早早聊等平台做过 TypeScript 主题分享,写过「TypeScript 的另一面:类型编程」专栏。同时也是一名开源爱好者,可以通过 GitHub 更多了解他。

\n

小册介绍

\n

\"课程介绍(1624x623).jpg\"

\n

当下,TypeScript 正在逐渐成为与前端框架以及 ES6 语法同一地位的基础工具,越来越多的开发者或团队已经将它作为首选语言之一。TypeScript 带来的收益十分明显,在代码健壮性、可读性、开发效率与开发体验等多个方面,都能带来显著提升。因此,越来越多的前端开发者开始尝试使用以及学习 TypeScript。

\n

但想要学好 TypeScript 并不是一件容易的事情。对 JavaScript 开发者来说,TypeScript 是一项全新的事物,有着一定的理解与上手成本。拿 TypeScript 的类型能力来说,它包括基础类型、内置类型、类型工具、类型编程、类型系统等数个概念,虽然这些概念分散开来并不复杂,但想要完全理解,达到融会贯通,需要大量的时间。

\n

想要找到正确、高效地学习路径,我们可以从每个阶段使用 TypeScript 的目的出发。在项目开始阶段,类型能力可以为 JavaScript 代码添加类型与类型检查来确保健壮性。在项目优化阶段,我们提前使用新语法或新特性来简化代码。在编译阶段,我们可以利用 tsc 以及 tsc 配置(TSConfig),最终获得可用的 JavaScript 代码

\n

因此 “类型-语法-工程”也是学习 TypeScript 的最佳路径。小册也是这样设计的,你只需要跟着学下来,就能搭建出 TypeScript 的完整知识体系。

\n

\"1280X1280.PNG\"

\n\n

就像这本小册的名字《 TypeScript 全面进阶指南 》一样,我们的目标是全方位、无死角地掌握 TypeScript。

\n

你会学到什么?

\n\n

适宜人群

\n\n

购买须知

\n
    \n
  1. 本小册为图文形式内容服务,共计 32 节;
  2. \n
  3. 全部文章预计 8 月 17 日更新完成;
  4. \n
  5. 购买用户可享有小册永久的阅读权限;
  6. \n
  7. 购买用户可进入小册微信群,与作者互动;
  8. \n
  9. 掘金小册为虚拟内容服务,一经购买成功概不退款;
  10. \n
  11. 掘金小册版权归北京北比信息技术有限公司所有,任何机构、媒体、网站或个人未经本网协议授权不得转载、链接、转贴或以其他方式复制发布/发表,违者将依法追究责任;
  12. \n
  13. 在掘金小册阅读过程中,如有任何问题,请邮件联系 xiaoce@xitu.io
  14. \n
", "draft_content": "", "draft_title": "小册介绍", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 238, "read_count": 0, "comment_count": 0, "ctime": 1649939437, "mtime": 1649939437, "is_update": 1, "draft_read_time": 0, "vid": "", "reading_progress": null }, "sections": [ { "id": 86887, "section_id": "7086435924271169550", "title": "开篇:用正确的方式学习 TypeScript", "user_id": "782508012077678", "booklet_id": "7086408430491172901", "status": 1, "content": "", "draft_content": "", "draft_title": "开篇:用正确的方式学习 TypeScript", "markdown_content": "", "markdown_show": "", "is_free": 1, "read_time": 444, "read_count": 6966, "comment_count": 51, "ctime": 1649939600, "mtime": 1649939600, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 87091, "section_id": "7100485525823782951", "title": "工欲善其事:打造最舒适的 TypeScript 开发环境", "user_id": "782508012077678", "booklet_id": "7086408430491172901", "status": 1, "content": "", "draft_content": "", "draft_title": "工欲善其事:打造最舒适的 TypeScript 开发环境", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 1083, "read_count": 3812, "comment_count": 13, "ctime": 1653210615, "mtime": 1653210615, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 86888, "section_id": "7086435924392804388", "title": "进入类型的世界:理解原始类型与对象类型", "user_id": "782508012077678", "booklet_id": "7086408430491172901", "status": 1, "content": "", "draft_content": "", "draft_title": "进入类型的世界:理解原始类型与对象类型", "markdown_content": "", "markdown_show": "", "is_free": 1, "read_time": 2252, "read_count": 4919, "comment_count": 35, "ctime": 1649939795, "mtime": 1649939795, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 86900, "section_id": "7087052987415134244", "title": "掌握字面量类型与枚举,让你的类型再精确一些", "user_id": "782508012077678", "booklet_id": "7086408430491172901", "status": 1, "content": "", "draft_content": "", "draft_title": "掌握字面量类型与枚举,让你的类型再精确一些", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 1493, "read_count": 2190, "comment_count": 25, "ctime": 1650096040, "mtime": 1650096040, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 87092, "section_id": "7100487738012467212", "title": "函数与 Class 中的类型:详解函数重载与面向对象", "user_id": "782508012077678", "booklet_id": "7086408430491172901", "status": 1, "content": "", "draft_content": "", "draft_title": "函数与 Class 中的类型:详解函数重载与面向对象", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 3040, "read_count": 2168, "comment_count": 38, "ctime": 1653211130, "mtime": 1653211130, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 87093, "section_id": "7100487738020855811", "title": "探秘内置类型:any、unknown、never 与类型断言", "user_id": "782508012077678", "booklet_id": "7086408430491172901", "status": 1, "content": "", "draft_content": "", "draft_title": "探秘内置类型:any、unknown、never 与类型断言", "markdown_content": "", "markdown_show": "", "is_free": 1, "read_time": 2098, "read_count": 2495, "comment_count": 13, "ctime": 1653211141, "mtime": 1653211141, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 87094, "section_id": "7100487786033053734", "title": "类型编程好帮手:TypeScript 类型工具(上)", "user_id": "782508012077678", "booklet_id": "7086408430491172901", "status": 1, "content": "", "draft_content": "", "draft_title": "类型编程好帮手:TypeScript 类型工具(上)", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 2003, "read_count": 1632, "comment_count": 8, "ctime": 1653211153, "mtime": 1653211153, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 87095, "section_id": "7100485525831680032", "title": "类型编程好帮手:TypeScript 类型工具(下)", "user_id": "782508012077678", "booklet_id": "7086408430491172901", "status": 1, "content": "", "draft_content": "", "draft_title": "类型编程好帮手:TypeScript 类型工具(下)", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 2452, "read_count": 1137, "comment_count": 16, "ctime": 1653211159, "mtime": 1653211159, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 87096, "section_id": "7100487863032086561", "title": "类型编程基石:TypeScript 中无处不在的泛型", "user_id": "782508012077678", "booklet_id": "7086408430491172901", "status": 1, "content": "", "draft_content": "", "draft_title": "类型编程基石:TypeScript 中无处不在的泛型", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 2626, "read_count": 1123, "comment_count": 8, "ctime": 1653211173, "mtime": 1653211173, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 86892, "section_id": "7086440845053788196", "title": "结构化类型系统:类型兼容性判断的幕后", "user_id": "782508012077678", "booklet_id": "7086408430491172901", "status": 1, "content": "", "draft_content": "", "draft_title": "结构化类型系统:类型兼容性判断的幕后", "markdown_content": "", "markdown_show": "", "is_free": 1, "read_time": 1248, "read_count": 1722, "comment_count": 1, "ctime": 1649941248, "mtime": 1649941248, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 87098, "section_id": "7100488161263878177", "title": "类型系统层级:从 Top Type 到 Bottom Type", "user_id": "782508012077678", "booklet_id": "7086408430491172901", "status": 1, "content": "", "draft_content": "", "draft_title": "类型系统层级:从 Top Type 到 Bottom Type", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 2694, "read_count": 692, "comment_count": 11, "ctime": 1653211251, "mtime": 1653211251, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 87097, "section_id": "7100487834879918113", "title": "类型里的逻辑运算:条件类型与 infer", "user_id": "782508012077678", "booklet_id": "7086408430491172901", "status": 1, "content": "", "draft_content": "", "draft_title": "类型里的逻辑运算:条件类型与 infer", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 3019, "read_count": 789, "comment_count": 6, "ctime": 1653211229, "mtime": 1653211229, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 87101, "section_id": "7100488836853006375", "title": "内置工具类型基础:别再妖魔化工具类型了!", "user_id": "782508012077678", "booklet_id": "7086408430491172901", "status": 1, "content": "", "draft_content": "", "draft_title": "内置工具类型基础:别再妖魔化工具类型了!", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 2687, "read_count": 610, "comment_count": 5, "ctime": 1653211418, "mtime": 1653211418, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 87099, "section_id": "7100487920280141836", "title": "反方向类型推导:用好上下文相关类型", "user_id": "782508012077678", "booklet_id": "7086408430491172901", "status": 1, "content": "", "draft_content": "", "draft_title": "反方向类型推导:用好上下文相关类型", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 1124, "read_count": 434, "comment_count": 2, "ctime": 1653211378, "mtime": 1653211378, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 86889, "section_id": "7086436622425653285", "title": "函数类型:协变与逆变的比较", "user_id": "782508012077678", "booklet_id": "7086408430491172901", "status": 1, "content": "", "draft_content": "", "draft_title": "函数类型:协变与逆变的比较", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 1294, "read_count": 488, "comment_count": 2, "ctime": 1649940583, "mtime": 1649940583, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 86935, "section_id": "7088641915502985250", "title": "了解类型编程与类型体操的意义,找到平衡点", "user_id": "782508012077678", "booklet_id": "7086408430491172901", "status": 1, "content": "", "draft_content": "", "draft_title": "了解类型编程与类型体操的意义,找到平衡点", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 267, "read_count": 392, "comment_count": 1, "ctime": 1650453073, "mtime": 1650453073, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 87100, "section_id": "7100488803369877543", "title": "内置工具类型进阶:类型编程进阶", "user_id": "782508012077678", "booklet_id": "7086408430491172901", "status": 1, "content": "", "draft_content": "", "draft_title": "内置工具类型进阶:类型编程进阶", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 4988, "read_count": 512, "comment_count": 4, "ctime": 1653211386, "mtime": 1653211386, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 87220, "section_id": "7105947956359987212", "title": "基础类型新成员:模板字符串类型入门", "user_id": "782508012077678", "booklet_id": "7086408430491172901", "status": 1, "content": "", "draft_content": "", "draft_title": "基础类型新成员:模板字符串类型入门", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 1978, "read_count": 317, "comment_count": 0, "ctime": 1654780348, "mtime": 1654780348, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 87250, "section_id": "7107458432751370273", "title": "类型编程新范式:模板字符串工具类型进阶", "user_id": "782508012077678", "booklet_id": "7086408430491172901", "status": 1, "content": "", "draft_content": "", "draft_title": "类型编程新范式:模板字符串工具类型进阶", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 4167, "read_count": 307, "comment_count": 3, "ctime": 1654867845, "mtime": 1654867845, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 87174, "section_id": "7105947956183826464", "title": "工程层面的类型能力:类型声明、类型指令与命名空间", "user_id": "782508012077678", "booklet_id": "7086408430491172901", "status": 1, "content": "", "draft_content": "", "draft_title": "工程层面的类型能力:类型声明、类型指令与命名空间", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 3203, "read_count": 328, "comment_count": 3, "ctime": 1654520888, "mtime": 1654520888, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 87140, "section_id": "7102447359308595240", "title": "在 React 中愉快地使用 TypeScript:内置类型与泛型坑位", "user_id": "782508012077678", "booklet_id": "7086408430491172901", "status": 1, "content": "", "draft_content": "", "draft_title": "在 React 中愉快地使用 TypeScript:内置类型与泛型坑位", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 4689, "read_count": 314, "comment_count": 3, "ctime": 1653725305, "mtime": 1653725305, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 87252, "section_id": "7107603379022463009", "title": "让 ESLint 来约束你的 TypeScript 代码:配置与规则集介绍", "user_id": "782508012077678", "booklet_id": "7086408430491172901", "status": 1, "content": "", "draft_content": "", "draft_title": "让 ESLint 来约束你的 TypeScript 代码:配置与规则集介绍", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 3432, "read_count": 247, "comment_count": 2, "ctime": 1654867883, "mtime": 1654867883, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 87253, "section_id": "7107533935978119171", "title": "全链路 TypeScript 工具库,找到适合你的工具", "user_id": "782508012077678", "booklet_id": "7086408430491172901", "status": 1, "content": "", "draft_content": "", "draft_title": "全链路 TypeScript 工具库,找到适合你的工具", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 1513, "read_count": 201, "comment_count": 1, "ctime": 1654867895, "mtime": 1654867895, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 86925, "section_id": "7088147142862176293", "title": "说说 TypeScript 和 ECMAScript 之间那些事儿", "user_id": "782508012077678", "booklet_id": "7086408430491172901", "status": 1, "content": "", "draft_content": "", "draft_title": "说说 TypeScript 和 ECMAScript 之间那些事儿", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 1754, "read_count": 164, "comment_count": 0, "ctime": 1650339073, "mtime": 1650339073, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 87254, "section_id": "7107603438330413059", "title": "装饰器与反射元数据:了解装饰器基本原理与应用", "user_id": "782508012077678", "booklet_id": "7086408430491172901", "status": 1, "content": "", "draft_content": "", "draft_title": "装饰器与反射元数据:了解装饰器基本原理与应用", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 4881, "read_count": 220, "comment_count": 4, "ctime": 1654867907, "mtime": 1654867907, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 87296, "section_id": "7110429713230725153", "title": "控制反转与依赖注入:基于装饰器的依赖注入实现", "user_id": "782508012077678", "booklet_id": "7086408430491172901", "status": 1, "content": "", "draft_content": "", "draft_title": "控制反转与依赖注入:基于装饰器的依赖注入实现", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 4146, "read_count": 200, "comment_count": 0, "ctime": 1655534708, "mtime": 1655534708, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 87255, "section_id": "7107603540327006220", "title": "TSConfig 全解(上):构建相关配置", "user_id": "782508012077678", "booklet_id": "7086408430491172901", "status": 0, "content": "", "draft_content": "", "draft_title": "TSConfig 全解(上):构建相关配置", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 3336, "read_count": 138, "comment_count": 0, "ctime": 1654867917, "mtime": 1654867917, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 87256, "section_id": "7107603583419285536", "title": "TSConfig 全解(下):检查相关、工程相关配置", "user_id": "782508012077678", "booklet_id": "7086408430491172901", "status": 0, "content": "", "draft_content": "", "draft_title": "TSConfig 全解(下):检查相关、工程相关配置", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 4585, "read_count": 92, "comment_count": 0, "ctime": 1654867926, "mtime": 1654867926, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 87258, "section_id": "7107603489647247372", "title": "基于 Prisma + NestJs 的 Node API :前置知识储备", "user_id": "782508012077678", "booklet_id": "7086408430491172901", "status": 0, "content": "", "draft_content": "", "draft_title": "基于 Prisma + NestJs 的 Node API :前置知识储备", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 2368, "read_count": 108, "comment_count": 0, "ctime": 1654868016, "mtime": 1654868016, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 87298, "section_id": "7110467427141419019", "title": "基于 Prisma + NestJs 的 Node API :项目开发与基于 Heroku 部署", "user_id": "782508012077678", "booklet_id": "7086408430491172901", "status": 0, "content": "", "draft_content": "", "draft_title": "基于 Prisma + NestJs 的 Node API :项目开发与基于 Heroku 部署", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 2401, "read_count": 121, "comment_count": 0, "ctime": 1655542562, "mtime": 1655542562, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 87257, "section_id": "7107603620119445536", "title": "TypeScript Compiler API 上手:打造 AST Checker 与 CodeMod", "user_id": "782508012077678", "booklet_id": "7086408430491172901", "status": 0, "content": "", "draft_content": "", "draft_title": "TypeScript Compiler API 上手:打造 AST Checker 与 CodeMod", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 0, "read_count": 143, "comment_count": 0, "ctime": 1654868007, "mtime": 1654868007, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 87259, "section_id": "7107604005907333124", "title": "总结:是结束,也是开始", "user_id": "782508012077678", "booklet_id": "7086408430491172901", "status": 0, "content": "", "draft_content": "", "draft_title": "总结:是结束,也是开始", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 0, "read_count": 134, "comment_count": 0, "ctime": 1654868023, "mtime": 1654868023, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 87260, "section_id": "7107603967302959116", "title": "漫谈:大厂一般是怎么考察候选人 TypeScript 技能水平的?", "user_id": "782508012077678", "booklet_id": "7086408430491172901", "status": 0, "content": "", "draft_content": "", "draft_title": "漫谈:大厂一般是怎么考察候选人 TypeScript 技能水平的?", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 0, "read_count": 279, "comment_count": 0, "ctime": 1654868092, "mtime": 1654868092, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 87297, "section_id": "7109709136928964646", "title": "漫谈:拥抱下一代 Node 框架—— DeepKit", "user_id": "782508012077678", "booklet_id": "7086408430491172901", "status": 0, "content": "", "draft_content": "", "draft_title": "漫谈:拥抱下一代 Node 框架—— DeepKit", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 0, "read_count": 205, "comment_count": 0, "ctime": 1655540861, "mtime": 1655540861, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null } ] } }